第63章 倍增法
倍增法(Binary Lifting)是一种基于"成倍增长"思想的高效算法,通过预处理将问题分解为多个的次规模的子问题,从而在查询时实现快速合并求解。该算法在时间复杂度上通常能将线性查询优化为对数级,广泛应用于数论、图论、字符串处理等领域。
63.1 倍增法的基本原理
63.1.1 核心思想
倍增法的核心是预处理出规模为的子问题的解,在查询时将原问题分解为若干个2的幂次对应的子问题,通过组合子问题的解得到原问题的答案。其本质是利用二进制表示的特性,将任意整数表示为若干个不重复的2的幂次之和,从而实现高效的分解与合并。
63.1.2 预处理与查询流程
预处理阶段:
- 确定需要预处理的最大幂次(为满足的最大整数,即)。
- 对于每个位置,预处理出以为起点、长度为区间的信息,记为。
- 预处理递推关系:
其中为合并两个子问题解的函数。
查询阶段:
- 将查询规模拆解为二进制:
- 依次处理每一个2的幂次子区间,通过函数合并结果得到最终答案。
63.1.3 时间复杂度
- 预处理:
- 单次查询:
63.2 倍增法的典型应用:快速幂
快速幂是倍增法在数论中的经典应用,用于高效计算,避免朴素循环的时间开销。
原理: 将指数拆分为二进制,例如二进制为,等价,则。 提前递推,遍历二进制位,若当前位为1则累乘对应幂次,全程取模防止溢出。
实现代码
long long fastPower (long long a, long long n, long long m) {
long long result=1;
a %= m;
while (n>0){
if(n & 1){
result = (result * a) % m;
}
a = (a * a) % m;
n >>= 1;
}
return result;
}